package com.yuhs.zixing.study.thread.juc.code002;

import lombok.SneakyThrows;

import java.util.concurrent.TimeUnit;

/**
 * @description 程序运行过程中出现了异常会咋样。默认锁会释放
 * 所以，在并发处理过程中，有异常要多加小心，不然可能发生不一致情况。
 * 比如：多个线程共同访问同一个资源时候，如果异常处理不合适，
 * 在第一个线程抛出异常，其他线程就会进入同步代码块，有可能访问到异常产生的数据。
 * 因此要格外小心处理同步业务逻辑处理的异常。
 * @author: yuhs
 * @date 2021/11/20 8:24 下午
 */
public class C03_Synchronized {
    // 定义一个资源
    int count = 0;

    /**
     * m 方法
     */
    @SneakyThrows
    public synchronized void m() {
        System.out.println("线程 " + Thread.currentThread().getName());
        while (true) {
            count++;
            System.out.println("线程 " + Thread.currentThread().getName() + " count = " + count);
            TimeUnit.SECONDS.sleep(1);
            if (count == 5) {
                System.out.println(count / 0);
            }
        }
    }

    public static void main(String[] args) {
        C03_Synchronized c03_synchronized = new C03_Synchronized();

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                c03_synchronized.m();
            }
        };

        new Thread(runnable, "t1").start();
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(runnable, "t2").start();

    }

}
